package com.erp.hr.base.controller;

import com.erp.hr.base.model.BaseModel;
import com.erp.hr.base.model.FileVO;
import com.erp.hr.base.service.BaseService;
import com.erp.hr.base.util.CommonUtils;
import com.erp.hr.base.vo.LegalityResultVO;
import com.erp.hr.base.vo.ResultVO;
import com.erp.hr.dao.model.HrStaffInfoRO;
import com.erp.hr.service.HrCommonService;
import org.redragon.framework.hibernate.model.Pages;
import org.redragon.framework.util.ShiroUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * 控制层基类
 * @Author: syz
 * @blame syz
 * @CreateTime: 2021/4/6
 */
public class BaseController {

    /**
     * 职员服务
     */
    @Autowired
    private HrCommonService hrCommonService;


    /**
     * 获取当前登录职员信息
     * @return 职员信息
     */
    protected HrStaffInfoRO getStaffInfo() {
        return hrCommonService.getStaffInfo(ShiroUtil.getPrincipal());
    }

    /**
     * 设置页面
     * @param pages 需要设置的页面
     * @return 设置后的页面
     */
    protected Pages setPages(Pages pages) {
        if(pages.getPage() == 0) {
            pages.setPage(1);
        }
        return pages;
    }

    /**
     * 保存或更新
     * @param service 服务对象
     * @param t 要保存或更新的对象
     * @param <T> BaseModel的子类
     * @return 保存或更新结果
     */
    protected <T extends BaseModel> ResultVO<String> saveOrUpdate(BaseService<T> service, T t){
        if(t.getId() != null) {
            return update(service, t);
        } else {
            return save(service, t);
        }
    }

    /**
     * 保存对象
     * @param service 服务对象
     * @param t 要保存的对象
     * @param <T> BaseModel的子类
     * @return 新增结果
     */
    protected <T extends BaseModel> ResultVO<String> save(BaseService<T> service, T t) {
        LegalityResultVO legalityResult = service.isLegalityData(t);
        if (legalityResult.getIllegality()){
            return ResultVO.error(legalityResult.getMessage());
        }
        setCreateInfo(t);
        return service.save(t) ? ResultVO.success() : ResultVO.error("保存失败!");
    }

    /**
     * 设置对象新建信息
     * @param t 需要设置新建信息的对象
     * @param <T> BaseModel的子类
     */
    private <T extends BaseModel> void setCreateInfo(T t) {
        String staffCode = getStaffInfo().getStaffCode();
        Date now = new Date();
        t.setIsDel(CommonUtils.IS_DEL_NO);
        t.setCreateUser(staffCode);
        t.setCreateTime(now);
        t.setUpdateUser(staffCode);
        t.setUpdateTime(now);
    }

    /**
     * 更新对象
     * @param service 服务对象
     * @param t 要更新的对象
     * @param <T> BaseModel的子类
     * @return 更新结果
     */
    protected <T extends BaseModel> ResultVO<String> update(BaseService<T> service, T t){
        LegalityResultVO legalityResult = service.isLegalityData(t);
        if (legalityResult.getIllegality()){
            return ResultVO.error(legalityResult.getMessage());
        }
        setUpdateInfo(t);
        return service.update(t) ? ResultVO.success() : ResultVO.error("更新失败!");
    }

    /**
     * 设置对象更新信息
     * @param t 需要设置更新信息的对象
     * @param <T> BaseModel的子类
     */
    private <T extends BaseModel> void setUpdateInfo(T t) {
        t.setUpdateUser(getStaffInfo().getStaffCode());
        t.setUpdateTime(new Date());
    }

    /**
     * 根据id删除对象及相关信息
     * @param service 服务对象
     * @param id 要需要删除对象的id
     * @param <T> BaseModel的子类
     * @return 删除结果
     */
    protected <T extends BaseModel> ResultVO<String> linkDelete(BaseService<T> service, Long id){
        return service.linkDelete(id) ? ResultVO.success() : ResultVO.error("删除失败!");
    }

    /**
     * 附件上传
     * @param request 请求对象
     * @param files 附件
     * @return 文件vo
     */
    protected List<FileVO> fileUpload(HttpServletRequest request, List<MultipartFile> files) {
        List<FileVO> result = new ArrayList<>();
        String url = new SimpleDateFormat("/yyyy/MM/dd/").format(new Date());
        String uri = request.getServletContext().getRealPath("/") + url;
        File dir = new File(uri);
        if (!dir.exists()) {
            dir.mkdirs();
        }
        try {
            for (MultipartFile f : files) {
                String fileName = f.getOriginalFilename();
                String newName = System.currentTimeMillis() + "FILE_NAME_START" + fileName;
                f.transferTo(new File(uri + newName));
                result.add(new FileVO(fileName, request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath() + url + newName));
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return result;
    }

}